perm filename CARCON[901,BGB] blob
sn#129631 filedate 1974-11-12 generic text, type T, neo UTF8
00100 TITLE CARCON
00200 Q←16
00400 Z←0
00500 CMD←14
00600 OPDEF MAIL [710B8]
00650 OPDEF TTYUUO [51B8]
00675 OPDEF ECHO [TTYUUO 3,]
00700 EXTERNAL EXP
00800 OPDEF FIX6 [120B8]
00900 OPDEF FIX [247B8]
00950
01000 ;CARCON EXPECTS TO RECEIVE COMMAND BUFFERS BY MAIL.
01100 ;THE BUFFER FORMAT IS AS FOLLOWS:
01150
01200 ;BUFF: -WC,,<ignored>
01300 ; <COMMAND1>
01400 ; <COMMAND2>
01500 ; .
01600 ; .
01700 ; .
01800 ; (MAX OF 37 OCTAL COMMANDS)
01850
01875
01900 ;THE FORMAT OF A <COMMAND> IS AS FOLLOWS:
01950
02000 ;BITS 0-2: DEVICE BEING COMMANDED
02100 ; 1=BACK WHEELS
02200 ; 2=CAMERA PAN
02300 ; 3=FRONT WHEELS
02400 ; 4=DRIVE MOTORS
02450
02500 ;BITS 3-17: TIME TO WAIT (IN SIXTHS OF A SECOND)
02600 ; BEFORE PICKING UP NEXT <COMMAND>
02650
02700 ;BITS 18-35: ANGLE COMMANDED
02800 ; FOR THE WHEELS. THIS MUST BE IN THE RANGE
02900 ; +/- 360 DECIMAL. FOR THE CAMERA, THE RANGE
03000 ; IS -90 TO +270, WHERE 0 IS STRAIGHT AHEAD.
03100 ; FOR THE DRIVE, 0 MEANS STOP, AND ANYTHING ELSE
03200 ; MEANS GO.
03225
03275
03300 ;A HANDY WAY TO COMPUTE THE POINTER WORD COUNT IS:
03350
03400 ; MOVE AC,[XWD -40,BUFFER]
03500 ; PUSH AC,<COMMAND1>
03600 ; PUSH AC,<COMMAND2>,etc
03700 ; SETCMM AC
03800 ; SUB AC, [XWD 40,0]
03900 ; MOVEM AC,BUFFER
04000 ;NOTE THAT THE WORD COUNT INCLUDES THE WORD CONTAINING THE
04100 ;COUNT
04200 ;ALSO BE ADVISED THAT RECEIPT OF A NEW BUFFER ABORTS
04300 ;EXECUTION OF ANY REMAINING COMMANDS IN THE OLD BUFFER
04400 ;THIS IS SO YOU CAN PANIC AND CHANGE YOUR MIND, OR
04500 ;STOP THE CART INSTANTLY
00100 CARCON: CALLI
00150 ECHO [ASCIZ /*/]
00200 SETZM JSTOP
00300 SETOM FLAG
00400 SPCWAR 1,ONCE
00500 SKIPE FLAG
00600 JRST .-1
00700 SPCWAR 636367
00800 SPCWAR 1,SPACE
00900 LOOP: MAIL 1,MBOX
00925 SKIPN MBOX
00975 ECHO [ASCIZ /NULL BUFFER RECEIVED
00980 /]
01000 MOVEI 1,CMDBUF
01100 HRRM 1,MBOX
01125 SKIPE JSTOP
01175 ECHO [ASCIZ /RESTART CARCON
01180 /]
01200 SETOM FLAG
01300 SKIPE FLAG
01400 JRST .-1
01500 JRST LOOP
01600 FLAG: Z
01700 ONCE: CONO 700,624054 ;STOP THE CART
01800 CONO 700,450050
01900 CONO 700,450055 ;SET UP UNUSED DACS
02000 SETZM DRCMD
02100 SETZM FLAG
02200 CALLI
02300 MBOX: BLOCK 40
02400 CMDBUF: BLOCK 40
02450 CMDTIM: Z
02500 JSTOP: Z
02600 DISMIS: Z
02700 FRANG: Z
02800 BKANG: Z
02900 CAMANG: Z
03000 DRCMD: Z
03100 BKW51: XWD 51,0
03200 CAM52: XWD 52,0
03300 FRW53: XWD 53,0
03400 DR54: XWD 54,0
03500 VSUP: 9.8
03600 VBE: 0.68
03700 RC: 4.76E-3
03800 4.8E-3
03900 5.85E-3
04000 CPULS: 1.791E-3
04100 CPMAX: 2.3E-3
04200 2.27E-3
04300 2.27E-3
04400 EPS: -0.99
04500 -0.54
04600 -0.7
04700 PULSW: Z
00100 SPACE: SKIPE 5 ;C(5)=-1 MEANS PDP-10 IS DEAD
00200 SETOM JSTOP
00300 SKIPL 6 ;C(6)<0 MEANS USER JOB IS DEAD
00400 SETOM JSTOP
00500 SKIPE JSTOP
00600 CALLI
01400 SOSLE DISMIS
01500 CALLI ;THIS RUNS SPCWAR EVERY 12 TICKS
01600 MOVEI 0,12
01700 MOVEM 0,DISMIS
01800
01900 SKIPN FLAG
02000 JRST OLDBUF
02100 MOVE 3,[XWD MBOX,CMDBUF]
02200 BLT 3,CMDBUF+37
02250 SETZM FLAG
03200 OLDBUF: MOVE CMD,CMDBUF ;WHERE ARE WE IN THE BUFFER
03300 SOSLE CMDTIM ;DO WE CARE?
03400 JRST CCOMP ;NO, WE CANT DO ANYTHING ANYWAY
03500 AOBJP CMD,CCOMP ;ARE WE FINISHED WITH THE SEQUENCE?
03600 MOVEM CMD,CMDBUF ;NO, SAVE FOR NEXT TIME
03700 MOVE 2,(CMD) ;GET THE NEXT COMMAND
03800 MOVEI 1,0
03900 LSHC 1,3 ;GET THE DEVICE BITS IN AC1
04000 LSH 2,-3 ;TIME IN LH,,COMMAND IN RH
04100 HLRZM 2,CMDTIM ;SAVE THE TIME
04200 HRREM 2,@PLACE-1(1) ;SAVE THE COMMAND
04300 JRST OLDBUF ;TRY AGAIN
04400 PLACE: BKANG
04500 CAMANG
04600 FRANG
04700 DRCMD
04800 -1↔-1↔-1 ;FLUSH THE LOSERS
00100 PULSE: 0 ;CALCULATES DAC VOLTAGE TO MAKE GIVEN WIDTH
00200 MOVE 2,PULSW ;FORMULA IS:
00300 FDV 2,RC(1) ;V(DAC)=2*SUPPLYVOLTAGE+EPSILON-(VSUPPLY-VBE)*E**(PULSW/RC)
00400 JSA Q,EXP
00500 2
00600 MOVE 3,VSUP
00700 FSB 3,VBE
00800 FMP 3,0
00900 MOVE 2,VSUP
01000 FSC 2,1
01100 FAD 2,EPS(1)
01200 FSB 2,3
01300 FMP 2,[102.4] ;MAKES DAC NUMBER FROM VOLTAGE
01400 FIX6 2,233000 ;FIX IT ,THIS LOC IS MODIFIED BY THE PROG.
01500 DPB 2,[POINT 10,BKW51(1),27]
01600 JRST @PULSE
00100 CCOMP: MOVE 2,BKANG ;CCOMP CONTAINS THE ALGORITHM FOR COMPUTING DAC
00200 MOVM 3,2 ;LAST CHECK OF ANGLE
00300 CAILE 3,=360 ;TOO BIG?
00400 JRST -1
00500 FSC 2,233 ;FLOAT THE ANGLE
00600 FDV 2,[360.0] ;GET FRACTION OF TOTAL ROTATION
00700 MOVE 3,CPULS ;CENTER WIDTH
00800 FSB 3,CPMAX ;TOTAL DELTA WIDTH
00900 FMP 2,3 ;FOR THIS ANGLE
01000 FAD 2,CPULS ;GET TOTAL WIDTH
01100 MOVEM 2,PULSW
01200 MOVEI 1,0
01300 JSR PULSE
01400 MOVE 2,FRANG ;THIS ROUTINE RUNS IN SPCWAR MODE
01500 MOVM 3,2 ;LAST CHECK OF FRONT
01600 CAILE 3,=360 ;TOO BIG?
01700 JRST -3
01800 FSC 2,233 ;FLOAT THE ANGLE
01900 FDV 2,[360.0] ;GET FRACTION OF TOTAL ROTATION
02000 MOVE 3,CPULS ;CENTER WIDTH
02100 FSB 3,CPMAX+2 ;TOTAL DELTA WIDTH
02200 FMP 2,3 ;FOR THIS ANGLE
02300 FAD 2,CPULS ;GET TOTAL WIDTH
02400 MOVEM 2,PULSW
02500 MOVEI 1,2
02600 JSR PULSE
02700 MOVE 2,CAMANG
02800 CAMCK: CAILE 2,=270
02900 JRST CAM1
03000 CAMGE 2,[-=90]
03100 JRST CAM2
03200 MOVEM 2,CAMANG
03300 SUBI 2,=90 ;CHANGE RANGE TO +/-180
03400 MOVM 3,2 ;LAST CHECK ON CAMERA
03500 CAILE 3,=180 ;TOO BIG?
03600 JRST -2
03700 FSC 2,233 ;FLOAT THE ANGLE
03800 FDV 2,[180.0] ;GET FRACTION OF TOTAL ROTATION
03900 MOVE 3,CPULS ;CENTER WIDTH
04000 FSB 3,CPMAX+1 ;TOTAL DELTA WIDTH
04100 FMP 2,3 ;FOR THIS ANGLE
04200 FAD 2,CPULS ;GET TOTAL WIDTH
04300 MOVEM 2,PULSW
04400 MOVEI 1,1
04500 JSR PULSE
04600 MOVEI 2,500000 ;HERE CALCULATE DRIVE VOLTAGE
04700 SKIPN DRCMD
04800 ADDI 2,40000 ;DRCMD=1 OR 2 MEANS GO
04900 HRRM 2,DR54
05000 DATAO 700,BKW51
05100 DATAO 700,CAM52
05200 DATAO 700,FRW53
05300 DATAO 700,DR54
05400 CALLI
05700
05800 CAM1: SUBI 2,=180
05900 JRST CAMCK
06000 CAM2: ADDI 2,=180
06100 JRST CAMCK
06300 END CARCON